home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / BOSS03.C < prev    next >
Text File  |  2000-03-27  |  10KB  |  304 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. */
  5. /* ドラゴンの腕で攻撃 */
  6. #include <xsp2lib.h>
  7. #include "../SPASSION.H"
  8. #include "../player.h"
  9. #include "../enemy.h"
  10. #include "../eshot.h"
  11. #include "../effect.h"
  12. #include "../priority.h"
  13. #include "../sound.h"
  14. #include "../entry.h"
  15. #include "../SUB.H"
  16. #ifndef NULL
  17. #define NULL ((void *) 0)
  18. #endif
  19.  
  20. #define P_X    (*((short *) (&player[0].lx)))    /*lxの上位ワード*/
  21. #define P_Y    (*((short *) (&player[0].ly)))    /*lyの上位ワード*/
  22.  
  23. #define PALET_MAIN    0x0700
  24.  
  25. static short MoveEnemyBoss03(ENEMY *);
  26. /*static void TiniEnemyBoss03(ENEMY *);*/
  27.  
  28. /* 左半分 */
  29. static HIT_XY4    hit_left_p={-20-PLAYER_HIT_X,-15-PLAYER_HIT_Y,PLAYER_HIT_X,15+PLAYER_HIT_Y};
  30. static HIT_XY4    hit_leftup_s=  {-20,-15,0,-12};
  31. static HIT_XY4    hit_leftdown_s={-20, 12,0,15};
  32. /* 脳の部分 */
  33. static HIT_XY4    hit_right_p={-PLAYER_HIT_X,-21-PLAYER_HIT_Y,21+PLAYER_HIT_X,21+PLAYER_HIT_Y};
  34. static HIT_XY4    hit_right_s={0,-21,21,21};
  35. /* 砲身の部分 */
  36. static HIT_XY4    hit_p[5]={999,999,999,999, -24,-6,-20,6, -28,-6,-20,6, -32,-6,-20,6, -36,-6,-20,6};
  37.  
  38. /* コア */
  39. extern HIT_XY4    hit_core_p[5];
  40. extern HIT_XY4    hit_core_o[5];
  41. extern HIT_XY4    hit_core_s[5];
  42. extern HIT_XY4    nohit;
  43.  
  44. static ENEMY dummy;
  45. static unsigned char seed=0;
  46.  
  47. void InitEnemyBoss03Hit(ENEMY *ene)
  48. {
  49.     short    i;
  50.     for(i=0;i<5;i++){
  51.         hit_p[i].x1=hit_p[i].x1-PLAYER_HIT_X;hit_p[i].y1=hit_p[i].y1-PLAYER_HIT_Y;
  52.         hit_p[i].x2=hit_p[i].x2+PLAYER_HIT_X;hit_p[i].y2=hit_p[i].y2+PLAYER_HIT_Y;
  53.     }
  54. }
  55. void InitEnemyBoss03(ENEMY *ene)
  56. {
  57.     ene->vx             = -65536/2;
  58.     ene->vy             = 0;
  59.     ene->hit_p[0]     =&hit_left_p;ene->hit_p[1] =&hit_left_p; ene->hit_p[2]=&hit_right_p; ene->hit_p[3]=&hit_p[0]; ene->hit_p[4]=NULL;
  60.     ene->hit_o[0]     =&nohit; ene->hit_o[1]=&nohit; ene->hit_o[2]=&nohit; ene->hit_o[3]=&nohit; ene->hit_o[4]=NULL;
  61.     ene->hit_s[0]     =&hit_leftup_s;ene->hit_s[1] =&hit_leftdown_s; ene->hit_s[2]=&hit_right_s; ene->hit_s[3]=&nohit; ene->hit_s[4]=NULL;
  62.     ene->pt             = obj_boss3;
  63.     ene->info         = PALET_MAIN | PRIORITY_BOSS;
  64.     ene->work=0;
  65.     ene->no_dead     = 0;
  66.     ene->func_enemy_move = MoveEnemyBoss03;
  67. /*    ene->func_enemy_tini = TiniEnemyBoss03;*/
  68.     ene->parts1 = ene->parts2 = &dummy;        /* 腕が出てくるまでの仮のパーツ */
  69.     dummy.child_death =0;
  70.     ene->parts3=MakeEnemy(ENEMY_CORE , ene->x-8, ene->y   ,1,  ene);    /* コア */
  71. #if 0
  72.     ene->parts3->child=MakeEnemy(ENEMY_SHIELD , 0, 0,0, ene->parts3);    /* これはダミー */
  73.     ene->parts3->child->child_death = 1;
  74.     ene->parts3->child->pt=0;
  75.     ene->parts3->child->hit_p[0]=NULL;
  76. #endif
  77.  
  78.     entry_counter_stop = !0;        /* エントリーカウンター停止 */
  79. }
  80.  
  81. static short MoveEnemyBoss03( ENEMY *ene )
  82. {
  83.     short    anim_num,angle1,angle2;
  84.     short    vxy[8]={0xFF00,0xFFFE,0xFE01,0xFEFF};
  85.     short    pow,i;
  86.     ESHOT    *eshot;
  87.     short Wait( ENEMY *ene, short time );
  88.  
  89.     /* 爆発 */
  90.     if( ene->dead_count ){
  91.         ene->dead_count++;
  92.         if( ene->y > 256+30+16 ){
  93.             ene->child_death=1;
  94.             if(!ene->parent){
  95.                 entry_counter_stop = 0;    /* エントリーカウンター停止解除 */
  96.                 return (0);        /* 消去 */
  97.             }else{                        /* ラスボスに呼び出された場合は解除しない */
  98.                 if( ene->child_kill )
  99.                     return (0);        /* 消去 */
  100.             }
  101.         }else{
  102.             if( !(ene->dead_count%20) ){
  103.                 short    exp_x,exp_y,x,y;
  104.                 exp_x=rndtable[seed++]&31;seed&=255;
  105.                 exp_y=rndtable[seed++]&31;seed&=255;
  106.                 if( rndtable[seed++]>128 ){exp_x*=-1;exp_y*=-1;seed&=255;}
  107.                 MakeEffect(EFFECT_EXPLMINI, 0, (x=ene->x+exp_x-8), (y=ene->y+exp_y-8));
  108.                 SetSE(SE_EXPL_MBOSS);    /* 爆発音 */
  109.                 if( !(ene->dead_count%60) ){
  110.                     MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
  111.                     MakeEffect(EFFECT_HAHENMINI, 0, x, y);
  112.                     SetSE(SE_EXPL_BOSS);    /* 爆発音 */
  113.                 }
  114.             }
  115.             ene->y = (ene->ly += 65536/2) >> 16;
  116.             xobj_set_st(ene);
  117.             return (1);
  118.         }
  119.     }
  120.  
  121.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  122.     ene->x = (ene->lx += ene->vx) >> 16;
  123.     ene->y = (ene->ly += ene->vy) >> 16;
  124.  
  125.     ene->parts3->x=((ene->parts3->lx=ene->lx-4*65536)>>16)-8;
  126.     ene->parts3->y=((ene->parts3->ly=ene->ly        )>>16)-8;
  127.  
  128.     if( rndtable[seed++]>250 ){
  129.         seed&=255;
  130.         MakeEnemy(ENEMY_BRAIN , 256+32  , rndtable[seed]+16, vxy[rndtable[seed]&3],  ene);
  131.     }
  132.  
  133.     switch (ene->state){
  134.     case 0:
  135.         switch (ene->work){
  136.         case 0:        /* 登場 */
  137.             if( ENE_X < 192+16 ){
  138.                 ene->vx = 0;
  139.                 if( Wait( ene, 180 ) ){        /*ドラゴンを取り込む */
  140.                     ene->vx = -65536/2;
  141.                     ene->work++;
  142.                 }
  143.             }
  144.             break;
  145.         case 1:        /* 中央へ */
  146.             if( ENE_X < 144+16 ){
  147.                 ene->vx = 0;
  148.                 /* ドラゴンの腕を出す */
  149.                 if( Wait( ene, 60 ) ){
  150.                     ene->parts1=MakeEnemy(ENEMY_BOSSARM, ene->x, ene->y-4,0x004, ene);
  151.                     ene->parts2=MakeEnemy(ENEMY_BOSSARM, ene->x, ene->y+4,0x104, ene);
  152.                     ene->work++;
  153.                 }
  154.             }
  155.             break;
  156.         case 2:
  157.             /* ドラゴンの腕が2体とも破壊されたら次の動きへ */
  158.             if( ene->parts1->child_death && ene->parts2->child_death ){
  159.                 ene->work=0;
  160.                 ene->state++;
  161.             }
  162.         }
  163.         break;
  164.     case 1:
  165.         switch (ene->work){
  166.         case 0:            /* 画面右に移動 */
  167.             ene->vx= 2*65536;
  168.             if( ENE_X > 200+16 ){
  169.                 ene->vx= 0;
  170.                 ene->work++;
  171.             }
  172.             break;
  173.         case 1:        /* プレイヤーの方に狙いをつける */
  174.             if( ENE_Y < player[0].y )
  175.                 ene->vy= 4*65536;
  176.             else
  177.                 ene->vy=-4*65536;
  178.             for(i=0;i<3;i++){
  179.                 pow=(rndtable[seed++]&0xF)+10;
  180.                 seed&=255;
  181.                 angle1=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
  182.                 if( ENE_X < player[0].x)
  183.                     angle1/=4;
  184.                 else
  185.                     angle1=angle1/4+192;
  186.                 MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, angle1, 4,0,ene);
  187.                 MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1-12)&255, 4,0,ene);
  188.                 MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1+12)&255, 4,0,ene);
  189.                 SetSE(SE_ESHOT_PARABOLA);    /* 敵ショット音 */
  190.             }
  191.             ene->work++;
  192.             break;
  193.         case 2:        /* プレイヤーの方に移動 */
  194.             if( rndtable[seed++]>240){
  195.                 pow=(rndtable[seed++]&0xF)+10;
  196.                 seed&=255;
  197.                 angle1=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
  198.                 if( ENE_X < player[0].x)
  199.                     angle1/=4;
  200.                 else
  201.                     angle1=angle1/4+192;
  202.                 MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, angle1, 4,0,ene);
  203.                 MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1-12)&255, 4,0,ene);
  204.                 MakeEShot(ESHOT_PARABOLA, ENE_X, ENE_Y, pow, (angle1+12)&255, 4,0,ene);
  205.                 SetSE(SE_ESHOT_PARABOLA);    /* 敵ショット音 */
  206.             }
  207.             if( (ene->vy > 0 && ENE_Y > player[0].y)            /* プレイヤーを追い越した */
  208.              || (ene->vy < 0 && ENE_Y < player[0].y)
  209.              || (ene->vy < 0 && ENE_Y < 32 + 16 )
  210.              || (ene->vy > 0 && ENE_Y > 224 + 16) ){
  211.                 ene->vy=0;
  212.                 ene->work++;
  213.             }
  214.             break;
  215.         case 3:        /* 時間稼ぎ */
  216.             if( Wait( ene, 20 ) ){
  217.                 SetSE(SE_EXPL_BATTERY);    /* 砲身を出す音(ボコボコ) */
  218.                 ene->work++;
  219.             }
  220.             break;
  221.         case 4:        /* 砲身を出す */
  222.             anim_num=(++ene->anim_count)/8;
  223.             ene->pt = obj_boss3+anim_num;
  224.             ene->parts3->pt=obj_obj+anim_num;
  225.             ene->hit_p[3] = &hit_p[anim_num];
  226.             if( anim_num == 4 )
  227.                 ene->work++;
  228.             break;
  229.         case 5:        /* 太いレーザー */
  230.             if( Wait( ene, 60 ) ){
  231.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle1=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle1, 4,0,ene);
  232.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1-32)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  233.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1-24)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  234.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1-16)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  235.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1- 8)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  236.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+ 8)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  237.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+16)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  238.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+24)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  239.                 MakeEShot(ESHOT_LASER00, ENE_X, ENE_Y, 5, angle2=(angle1+32)&255, 4,0,ene);MakeEShot(ESHOT_CUTTER, ENE_X, ENE_Y,15, angle2, 4,0,ene);
  240.                 eshot=MakeEShot(ESHOT_LASEREX, ENE_X, ENE_Y, 5, 128, 4,0,ene);
  241.                 eshot->box_x=-38-16;eshot->box_y=-16;
  242.                 SetSE(SE_EXLASER);    /* 敵ショット音 */
  243.                 ene->work++;
  244.             }
  245.             break;
  246.         case 6:        /* 時間稼ぎ */
  247.             if( Wait( ene, 120 ) ){
  248.                 ene->vy=0;
  249.                 ene->work++;
  250.             }
  251.             break;
  252.         case 7:        /* 砲身をしまう */
  253.             anim_num=(--ene->anim_count)/8;
  254.             ene->pt = obj_boss3+anim_num;
  255.             ene->parts3->pt=obj_obj+anim_num;
  256.             ene->hit_p[3] = &hit_p[anim_num];
  257.             if( anim_num == 0 ){
  258.                 ene->anim_count=0;
  259.                 ene->work=1;
  260.             }
  261.         }
  262.         break;
  263.     }
  264.  
  265. #if 0
  266.             ene->state = 1;
  267.             ene->lx = 128*65536;
  268.             ene->ly = 128*65536;
  269.             ene->vx = 0;
  270.             ene->vy = 0;
  271.             if( BITSNS(0x04) & BIT(1) ){
  272.                 while( BITSNS(0x04) & BIT(1) );
  273.                 entry_counter_stop = 0;
  274.                 return (0);
  275.             }
  276. #endif
  277.  
  278.     /* コアが破壊された */
  279.     if( ene->parts3->child_death ){
  280.         MakeEffect(EFFECT_EXPL, 0, ene->x, ene->y);
  281.         SetSE(SE_EXPL_BOSS);    /* 爆発音 */
  282.         MakeEffect (EFFECT_HAHEN, 0, ene->x, ene->y);
  283.         if(!eshot_erase)
  284.             eshot_erase = ESHOT_ERASE;    /* 弾消し */
  285.         ene->player->score += 15;
  286.         ene->parts1->child_kill=1;
  287.         ene->parts2->child_kill=1;
  288.         ene->hit_p[0]=NULL;
  289.         ene->dead_count=1;
  290.     }
  291.  
  292.     xobj_set_st(ene);
  293.     xsp_set_st(ene->parts3);
  294.  
  295.     return(1);
  296. }
  297.  
  298.  
  299. /*
  300. static void TiniEnemyBoss03(ENEMY * p)
  301. {
  302. }
  303. */
  304.